iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 6
1
DevOps

.NET Core 專案持續整合與部署系列 第 6

Integrate:Git Hook

  • 分享至 

  • xImage
  •  

TL;DR

透過 Git Hook 讓我們在 Chink-in 程式碼( git push)前、或是在 Local 提交變動(git commit)前,先執行 dotnet test 以確保程式碼是沒有錯誤的。

正文

在前幾天,我們大致暸解如何透過 .NET Core CLI 進行一些以往習慣透過 IDE 進行的操作。而在講述使用 CI/CD 工具前,或許我們可以在 Local 進行持續整合的第一步,那就是透過 Git Hook 去做一些檢測,以確保每一次 Commit 或每一次 Push 都有一定的品質保證。

本篇不會在 Git Hook 做太多詳細的介紹,這部分我打算在隔壁棚《Git 其然,Git 其所然》講述。所以只會針對方法做快速的程式碼示例:

所有 Git Hook 的腳本,都會存在該專案根目錄下的 .git/hooks 目錄中。在通常情況下,裡面會已經有許多範例腳本,並且以 .sample 做為結尾。而當我們把 .sample 去掉時,該檔案就會成為如其名的一個 Git Hook,在做對應的 Git 操作時,順便執行腳本裡面所寫的指令。

在本篇我們會用到的 Git Hook 會是:

  • pre-commit:在進行 commit 前,執行此腳本。
  • pre-push:在將程式碼 Push 到 Remote Repository 前,執行此腳本。

假設今天的情境是,在進行 commit 前,必須通過測試,那就在 .git/hooks/ 底下新增一個 pre-commit 檔案,內容為:

#!/bin/sh

# Execute testing without output
dotnet test > /dev/null 2>&1

# Restore result (retuen code) of testing
rc=$?

if [ $rc -ne 0 ] ; then
    echo "You should pass the testing before action"
    echo ""
    exit $rc
fi

為了測試這個腳本是否能成功運行,我們將測試專案的 Test1() 方法強制失敗:

using Xunit;

namespace WebProj.Tests
{
    public class UnitTest1
    {
        [Fact]
        public void Test1()
        {
            Assert.True(false);
        }
    }
}

先執行一次 dotnet test 確認測試必定失敗:

$ dotnet test
Test run for /Users/ironman/dotnet-sln/WebProj.Tests/bin/Debug/netcoreapp2.2/WebProj.Tests.dll(.NETCoreApp,Version=v2.2)
Microsoft (R) Test Execution Command Line Tool Version 16.2.0-preview-20190606-02
Copyright (c) Microsoft Corporation.  All rights reserved.

Starting test execution, please wait...
[xUnit.net 00:00:00.50]     WebProj.Tests.UnitTest1.Test1 [FAIL]
  X WebProj.Tests.UnitTest1.Test1 [5ms]
  Error Message:
   Assert.True() Failure
Expected: True
Actual:   False
  Stack Trace:
     at WebProj.Tests.UnitTest1.Test1() in /Users/ironman/dotnet-sln/WebProj.Tests/UnitTest1.cs:line 10

Test Run Failed.
Total tests: 1
     Failed: 1
 Total time: 1.2550 Seconds

接著嘗試進行 commit:

$ git commit
You should pass the testing before action

TODO

此篇只是初稿,會在這 30 天進行進一步的修改,預計

  • 解釋為什麼要在 Local 這麼做
  • 比較好的實踐

上一篇
.NET Core CLI:restore、build 與 test 行為關係
下一篇
導讀:我們該持續整合什麼?
系列文
.NET Core 專案持續整合與部署31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言